import torch
from torch.utils.data import Dataset

"""
torch.utils.data.Dataset:数据集的抽象类，需要定义并实现__len__（数据集大小）和__getitem__（索引）
torch.utils.data.TensorDataset:基于张量的数据集，适合处理数据-标签对，直接支持批处理和迭代。
torch.utils.data.DataLoader:封装Dataset的迭代器，提供批处理，数据打乱，多线程加载，
torch.utils.dataset.ImageFolder:从文件夹加载图像数据，没饿过子文件夹代表一个类别，适用与图像分类任务。

"""

class Mydataset(Dataset):
    def __init__(self,data,labels):
        #数据初始化
        self.data=data
        self.labels=labels
    def __len__(self):
        return len(self.data)
    def __getitem__(self,idx):
        sample=self.data[idx]
        label=self.labels[idx]
        return sample,label
#史称实例数据
data =torch.randn(100,5)#100个样本，每个样本有5个特征
labels= torch.randint(0,2,(100,))#每100个标签，取值为0或者1

#实例化数据集
dataset=Mydataset(data,labels)

#测试数据集
print(len(dataset))
print(dataset[10])

'''
DataLoader用于批量加载数据集
batch_size:批量加载
shuffle=True ：打乱顺序加载
num_workers 多线程加载
'''

from torch.utils.data import DataLoader

#生成示例数据
data=torch.randn(100,5)
labels=torch.randint(0,2,(100,))#生成一百个标签 取值为0和1

#实例化数据集
dataset=Mydataset(data,labels)

#实例化DataLoader
dataloader=DataLoader(dataset,batch_size=10,shuffle=True,num_workers=0)
#遍历DataLoader
for batch_idx,(batch_data,batch_labels) in enumerate(dataloader):
    print(f'批次{batch_idx+1}')
    print(f'数据:',batch_data)
    print(f'标签:',batch_labels)
    if batch_idx==2: #仅显示前三个批次
        break
